import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 */
// 3. 创建一个类，之后jackson提取出来的数据要放到这个类的实例中
class User {
    private String userId;
    private String classId;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getClassId() {
        return classId;
    }

    public void setClassId(String classId) {
        this.classId = classId;
    }
}

@WebServlet("/postJson")
public class PostJsonServlet extends HttpServlet {

    // 1.创建一个jackson的核心对象，通过这个核心对象来分解提取json中的数据
    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 2. 读取 body 中的请求，然后使用 ObjectMapper 来解析成需要的对象
        // readValue 就是把 JSON 格式的字符串转成 Java 的对象
        // 第一个参数，表示对哪个字符串进行转换，这个参数可以是一个String，也可以是一个 InputStream 对象，还可以是一个 File 对象
        // req的getInputStream方法就是以InputStream的方式返回了body的内容，我们可以直接传进去
        // 第二个参数，表示要把这个 JSON 格式的字符串转成哪个对象，这个参数需要是类对象
        // 这个方法内部会通过反射来获取到类对象中每个成员变量的名称
        // 如果JSON字符串的key有名字和成员变量一致，那么就会把对应的value赋值给这个成员变量，否则跳过
        // 因此我们需要保证我们提前知道JSON字符串中的key，然后自定义类里面有相同的名字
        // 保证传过来的数据我们都够获取到
        // 最后返回一个第二个参数类对象的实例，实例内部已经把能赋值的都给赋值好了，我们就可以使用了
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        resp.getWriter().write("userId: " + user.getUserId() + ", classId: " + user.getClassId());
    }
}
